gdk: Make gdk_pixbuf_get_from_*() bindable
authorBenjamin Otte <otte@redhat.com>
Sat, 2 Oct 2010 00:47:55 +0000 (02:47 +0200)
committerBenjamin Otte <otte@redhat.com>
Sat, 2 Oct 2010 01:08:24 +0000 (03:08 +0200)
The ownership of the return value for gdk_pixbuf_get_from_window() and
gdk_pixbuf_get_from_surface() was determined by the first argument.

Because that is an ugly design and the functions are new to GTK3, we
decided to adapt them.
And that adaptation was quite easy since almost no one passses anything
but NULL as the first argument.

demos/testpixbuf-color.c
demos/testpixbuf-save.c
docs/tools/shooter.c
gdk/gdkpixbuf-drawable.c
gdk/gdkpixbuf.h
gtk/gtkcolorsel.c
gtk/gtkoffscreenwindow.c

index 5ce086cf9092421cbeb6fcba7e40469dba9f90bf..3f762e67079cd1037d82429526cd721faf93a868 100644 (file)
@@ -112,8 +112,8 @@ main (int argc, char **argv)
        gtk_init (&argc, &argv);
 
        root = gdk_get_default_root_window ();
-       pixbuf = gdk_pixbuf_get_from_window (NULL, root,
-                                            0, 0, 0, 0, 150, 160);
+       pixbuf = gdk_pixbuf_get_from_window (root,
+                                            0, 0, 150, 160);
 
        /* PASS */
        g_debug ("try to save PNG with a profile");
index e7cdd6034cf31fb9202710b0a10b426d9dcfe125..5277c89a6fdaca6a2c55f5092111bf279dde2868 100644 (file)
@@ -335,8 +335,8 @@ configure_cb (GtkWidget *drawing_area, GdkEventConfigure *evt, gpointer data)
                 GdkPixbuf *new_pixbuf;
 
                 root = gdk_get_default_root_window ();
-                new_pixbuf = gdk_pixbuf_get_from_window (NULL, root,
-                                                         0, 0, 0, 0, evt->width, evt->height);
+                new_pixbuf = gdk_pixbuf_get_from_window (root,
+                                                         0, 0, evt->width, evt->height);
                 g_object_set_data_full (G_OBJECT (drawing_area), "pixbuf", new_pixbuf,
                                         (GDestroyNotify) g_object_unref);
         }
@@ -356,8 +356,8 @@ main (int argc, char **argv)
         gtk_init (&argc, &argv);   
 
         root = gdk_get_default_root_window ();
-        pixbuf = gdk_pixbuf_get_from_window (NULL, root,
-                                             0, 0, 0, 0, 150, 160);
+        pixbuf = gdk_pixbuf_get_from_window (root,
+                                             0, 0, 150, 160);
    
         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
         g_signal_connect (window, "delete_event",
index ec3d551cfac6764de240145c3405de7b9682d737..873609d972323e431aec5a9cc02fc748cdec0023 100644 (file)
@@ -164,8 +164,8 @@ take_window_shot (Window   child,
   if (y_orig + height > gdk_screen_height ())
     height = gdk_screen_height () - y_orig;
 
-  tmp = gdk_pixbuf_get_from_window (NULL, window,
-                                   x, y, 0, 0, width, height);
+  tmp = gdk_pixbuf_get_from_window (window,
+                                   x, y, width, height);
 
   if (include_decoration)
     tmp2 = remove_shaped_area (tmp, xid);
index d7021d778336bad710ea19f3c62b868fc717bef9..f638ce1d0752575f6ee4c65f049776ed72f5e5ee 100644 (file)
 
 /**
  * gdk_pixbuf_get_from_window:
- * @dest: (allow-none): Destination pixbuf, or %NULL if a new pixbuf
- *     should be created
  * @window: Source window
  * @src_x: Source X coordinate within @window
  * @src_y: Source Y coordinate within @window
- * @dest_x: Destination X coordinate in @dest, or 0 if @dest is NULL
- * @dest_y: Destination Y coordinate in @dest, or 0 if @dest is NULL
  * @width: Width in pixels of region to get
  * @height: Height in pixels of region to get
  *
  * representation inside a #GdkPixbuf. In other words, copies
  * image data from a server-side drawable to a client-side RGB(A) buffer.
  * This allows you to efficiently read individual pixels on the client side.
- *
- * If the specified destination pixbuf @dest is %NULL, then this
- * function will create an RGB pixbuf with 8 bits per channel and no
- * alpha, with the same size specified by the @width and @height
- * arguments.  In this case, the @dest_x and @dest_y arguments must be
- * specified as 0.  If the specified destination pixbuf is not %NULL
- * and it contains alpha information, then the filled pixels will be
- * set to full opacity (alpha = 255).
+ * 
+ * This function will create an RGB pixbuf with 8 bits per channel with
+ * the same size specified by the @width and @height arguments. The pixbuf
+ * will contain an alpha channel if the @window contains one.
  *
  * If the window is off the screen, then there is no image data in the
- * obscured/offscreen regions to be placed in the pixbuf. The contents
- * of portions of the pixbuf corresponding to the offscreen region are
- * undefined.
+ * obscured/offscreen regions to be placed in the pixbuf. The contents of
+ * portions of the pixbuf corresponding to the offscreen region are undefined.
  *
  * If the window you're obtaining data from is partially obscured by
  * other windows, then the contents of the pixbuf areas corresponding
  * (In short, there are several ways this function can fail, and if it fails
  *  it returns %NULL; so check the return value.)
  *
- * Return value: The same pixbuf as @dest if it was non-%NULL, or a
- *     newly-created pixbuf with a reference count of 1 if no destinatio
- *     pixbuf was specified, or %NULL on error
+ * Return value: (transfer full): A newly-created pixbuf with a reference
+ * count of 1, or %NULL on error
  **/
 GdkPixbuf *
-gdk_pixbuf_get_from_window (GdkPixbuf   *dest,
-                            GdkWindow   *src,
+gdk_pixbuf_get_from_window (GdkWindow   *src,
                             int src_x,  int src_y,
-                            int dest_x, int dest_y,
                             int width,  int height)
 {
   cairo_surface_t *surface;
+  GdkPixbuf *dest;
   
   g_return_val_if_fail (GDK_IS_WINDOW (src), NULL);
   g_return_val_if_fail (gdk_window_is_viewable (src), NULL);
 
-  if (!dest)
-    g_return_val_if_fail (dest_x == 0 && dest_y == 0, NULL);
-  else
-    {
-      g_return_val_if_fail (gdk_pixbuf_get_colorspace (dest) == GDK_COLORSPACE_RGB, NULL);
-      g_return_val_if_fail (gdk_pixbuf_get_n_channels (dest) == 3 ||
-                            gdk_pixbuf_get_n_channels (dest) == 4, NULL);
-      g_return_val_if_fail (gdk_pixbuf_get_bits_per_sample (dest) == 8, NULL);
-    }
-
   surface = _gdk_drawable_ref_cairo_surface (src);
-  dest = gdk_pixbuf_get_from_surface (dest,
-                                      surface,
+  dest = gdk_pixbuf_get_from_surface (surface,
                                       src_x, src_y,
-                                      dest_x, dest_y,
                                       width, height);
   cairo_surface_destroy (surface);
 
@@ -163,14 +140,11 @@ convert_alpha (guchar  *dest_data,
                int      src_stride,
                int      src_x,
                int      src_y,
-               int      dest_x,
-               int      dest_y,
                int      width,
                int      height)
 {
   int x, y;
 
-  dest_data += dest_stride * dest_y + dest_x * 4;
   src_data += src_stride * src_y + src_x * 4;
 
   for (y = 0; y < height; y++) {
@@ -206,14 +180,11 @@ convert_no_alpha (guchar  *dest_data,
                   int      src_stride,
                   int      src_x,
                   int      src_y,
-                  int      dest_x,
-                  int      dest_y,
                   int      width,
                   int      height)
 {
   int x, y;
 
-  dest_data += dest_stride * dest_y + dest_x * 3;
   src_data += src_stride * src_y + src_x * 4;
 
   for (y = 0; y < height; y++) {
@@ -232,13 +203,9 @@ convert_no_alpha (guchar  *dest_data,
 
 /**
  * gdk_pixbuf_get_from_surface:
- * @dest: (allow-none): Destination pixbuf, or %NULL if a new pixbuf
- *     should be created
  * @surface: surface to copy from
  * @src_x: Source X coordinate within @surface
  * @src_y: Source Y coordinate within @surface
- * @dest_x: Destination X coordinate in @dest, or 0 if @dest is NULL
- * @dest_y: Destination Y coordinate in @dest, or 0 if @dest is NULL
  * @width: Width in pixels of region to get
  * @height: Height in pixels of region to get
  *
@@ -247,54 +214,32 @@ convert_no_alpha (guchar  *dest_data,
  * individual pixels from cairo surfaces. For #GdkWindows, use
  * gdk_pixbuf_get_from_surface() instead.
  *
- * If the specified destination pixbuf @dest is %NULL, then this function
- * will create an RGB pixbuf with 8 bits per channel. The pixbuf will contain
- * an alpha channel if the @surface contains one. In this case, the @dest_x
- * and @dest_y arguments must be specified as 0.
+ * This function will create an RGB pixbuf with 8 bits per channel. The pixbuf
+ * will contain an alpha channel if the @surface contains one.
  *
- * Return value: The same pixbuf as @dest if it was non-%NULL, or a
- *     newly-created pixbuf with a reference count of 1 if no destination
- *     pixbuf was specified, or %NULL on error
+ * Return value: (transfer full): A newly-created pixbuf with a reference count
+ * of 1, or %NULL on error
  **/
 GdkPixbuf *
-gdk_pixbuf_get_from_surface  (GdkPixbuf       *dest,
-                              cairo_surface_t *surface,
+gdk_pixbuf_get_from_surface  (cairo_surface_t *surface,
                               int              src_x,
                               int              src_y,
-                              int              dest_x,
-                              int              dest_y,
                               int              width,
                               int              height)
 {
   cairo_content_t content;
+  GdkPixbuf *dest;
   
   /* General sanity checks */
   g_return_val_if_fail (surface != NULL, NULL);
   g_return_val_if_fail (src_x >= 0 && src_y >= 0, NULL);
   g_return_val_if_fail (width > 0 && height > 0, NULL);
 
-  if (!dest)
-    {
-      g_return_val_if_fail (dest_x == 0 && dest_y == 0, NULL);
-
-      content = cairo_surface_get_content (surface) | CAIRO_CONTENT_COLOR;
-      dest = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
-                             !!(content & CAIRO_CONTENT_ALPHA),
-                             8,
-                             width, height);
-    }
-  else
-    {
-      g_return_val_if_fail (gdk_pixbuf_get_colorspace (dest) == GDK_COLORSPACE_RGB, NULL);
-      g_return_val_if_fail (gdk_pixbuf_get_n_channels (dest) == 3 ||
-                            gdk_pixbuf_get_n_channels (dest) == 4, NULL);
-      g_return_val_if_fail (gdk_pixbuf_get_bits_per_sample (dest) == 8, NULL);
-      g_return_val_if_fail (dest_x >= 0 && dest_y >= 0, NULL);
-      g_return_val_if_fail (dest_x + width <= gdk_pixbuf_get_width (dest), NULL);
-      g_return_val_if_fail (dest_y + height <= gdk_pixbuf_get_height (dest), NULL);
-
-      content = gdk_pixbuf_get_has_alpha (dest) ? CAIRO_CONTENT_COLOR_ALPHA : CAIRO_CONTENT_COLOR;
-    }
+  content = cairo_surface_get_content (surface) | CAIRO_CONTENT_COLOR;
+  dest = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
+                         !!(content & CAIRO_CONTENT_ALPHA),
+                         8,
+                         width, height);
 
   surface = gdk_cairo_surface_coerce_to_image (surface, content, src_x + width, src_y + height);
   cairo_surface_flush (surface);
@@ -310,7 +255,6 @@ gdk_pixbuf_get_from_surface  (GdkPixbuf       *dest,
                    cairo_image_surface_get_data (surface),
                    cairo_image_surface_get_stride (surface),
                    src_x, src_y,
-                   dest_x, dest_y,
                    width, height);
   else
     convert_no_alpha (gdk_pixbuf_get_pixels (dest),
@@ -318,7 +262,6 @@ gdk_pixbuf_get_from_surface  (GdkPixbuf       *dest,
                       cairo_image_surface_get_data (surface),
                       cairo_image_surface_get_stride (surface),
                       src_x, src_y,
-                      dest_x, dest_y,
                       width, height);
 
   cairo_surface_destroy (surface);
index 6b21078edb167e7e0601ed901b9df736e8eac6a0..61a1392d09d9fbc8d4662e1027f8141a1f6c977a 100644 (file)
 G_BEGIN_DECLS
 
 /* Fetching a region from a drawable */
-GdkPixbuf *gdk_pixbuf_get_from_window   (GdkPixbuf   *dest,
-                                        GdkWindow   *window,
+GdkPixbuf *gdk_pixbuf_get_from_window   (GdkWindow   *window,
                                         int          src_x,
                                         int          src_y,
-                                        int          dest_x,
-                                        int          dest_y,
                                         int          width,
                                         int          height);
 
-GdkPixbuf *gdk_pixbuf_get_from_surface  (GdkPixbuf       *dest,
-                                         cairo_surface_t *surface,
+GdkPixbuf *gdk_pixbuf_get_from_surface  (cairo_surface_t *surface,
                                         int              src_x,
                                         int              src_y,
-                                        int              dest_x,
-                                        int              dest_y,
                                         int              width,
                                         int              height);
 
index 7436d6adeba8498a958cadc4d158a104bcfbf7cf..1814394697197859db1327d854f76b607dbc04f1 100644 (file)
@@ -1653,9 +1653,8 @@ grab_color_at_pointer (GdkScreen *screen,
   
   priv = colorsel->private_data;
   
-  pixbuf = gdk_pixbuf_get_from_window (NULL, root_window,
+  pixbuf = gdk_pixbuf_get_from_window (root_window,
                                        x_root, y_root,
-                                       0, 0,
                                        1, 1);
   if (!pixbuf)
     {
@@ -1664,9 +1663,8 @@ grab_color_at_pointer (GdkScreen *screen,
       GdkWindow *window = gdk_display_get_window_at_device_position (display, device, &x, &y);
       if (!window)
        return;
-      pixbuf = gdk_pixbuf_get_from_window (NULL, window,
+      pixbuf = gdk_pixbuf_get_from_window (window,
                                            x, y,
-                                           0, 0,
                                            1, 1);
       if (!pixbuf)
        return;
index 69356fd151db75641daa188c029de99fda4e3988..ee37a9ae1dbea272ec7feb1f59e6c23f77581dc4 100644 (file)
@@ -314,8 +314,8 @@ gtk_offscreen_window_get_pixbuf (GtkOffscreenWindow *offscreen)
 
   if (surface != NULL)
     {
-      pixbuf = gdk_pixbuf_get_from_surface (NULL, surface,
-                                            0, 0, 0, 0,
+      pixbuf = gdk_pixbuf_get_from_surface (surface,
+                                            0, 0,
                                             gdk_window_get_width (window),
                                             gdk_window_get_height (window));
     }